package com.itheima.reggie.web.controller;

import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.itheima.reggie.entity.Category;
import com.itheima.reggie.service.CategoryService;
import com.itheima.reggie.web.R;
import com.sun.media.jfxmedia.logging.Logger;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;

import java.util.List;

/**
 * 分类控制器
 *
 * @Author Vsunks.v
 * @Blog blog.sunxiaowei.net/996.mba
 * @Description: 分类控制器，包含了菜品分类和套餐分类
 */
@Slf4j
@RestController
@RequestMapping("/category")
public class CategoryController {

    @Autowired
    CategoryService categoryService;


    /**
     * 保存分类，保存时检查名称是否重复
     *
     * @param category 待保存到分类
     * @return
     */
    @PostMapping
    public R save(@RequestBody Category category) {
        log.info("新增分类，参数为：[{}]", category);
        // 参数校验

        // 保存
        boolean result = categoryService.saveWithNameCheck(category);

        // 组织数据并返回
        if (result) {
            return R.success("新增分类成功", null);
        }
        return R.fail("新增分类失败");
    }


    /**
     * 分页查询分类，并脱敏
     *
     * @param pageNum  页码
     * @param pageSize 页面大小
     * @return 分页对象
     */
    @GetMapping("/page")
    public R<Page> page(@RequestParam("page") Integer pageNum, Integer pageSize) {
        // 打印日志
        log.info("分页查询分类，查询第{}页，页面大小{}", pageNum, pageSize);

        // 参数校验，无值时，设置默认数据
        if (pageNum == null) {
            pageNum = 1;
        }
        if (pageSize == null) {
            pageSize = 10;
        }

        // 查询
        Page<Category> page = categoryService.page(pageNum, pageSize);

        // 组织数据并返回
        return R.success("分页查询成功", page);

    }


    /**
     * 删除分类如果该分类在使用，则删除失败
     *
     * @param id 要删除的分类Id
     * @return 删除是否成功
     */
    @DeleteMapping
    public R deleteById(Long id) {
        // 打印日志
        log.info("删除id为{}的分类", id);

        // 参数校验
        if (id == null) {
            return R.fail("参数有误");
        }

        // 调用service删除
        boolean result = categoryService.removeById(id);


        // 组织数据并返回
        if (result) {
            return R.success("删除分类成功", null);
        }
        return R.fail("删除分类失败");
    }

    /**
     * 修改分类，名称不能和其他已有名称重复
     *
     * @param category 要修改的分类信息
     * @return 是否修改成功
     */
    @PutMapping
    public R update(@RequestBody Category category) {
        // 记录日志
        log.info("更新分类，分类信息：[{}]", category);

        // 校验数据

        // 更新（名称不能重复）
        boolean result = categoryService.updateByIdWithNameCheck(category);

        // 组织数据并返回
        if (result) {
            return R.success("修改成功", null);
        }
        return R.fail("修改失败");

    }


    /**
     * 按照【类型/名称】条件查询所有的分类数据。
     * 排序主要条件：sort升序
     * 排序次要条件：updateTime 降序
     *
     * @param type 类型id
     * @return 所有符合要求的分类的集合
     */
    @GetMapping("/list")
    public R<List<Category>> listByType(Integer type) {
        // 记录日志
        log.info("根据分类类型(套餐分类/菜品分类)查询该类型下所有的分类，类型id：[{}]", type);

        // 参数校验
        if (!(Integer.valueOf(1).equals(type) || Integer.valueOf(2).equals(type))) {
            return R.fail("套餐分类参数有误");
        }

        // 查询
        List<Category> categories = categoryService.listByType(type);

        // 组织数据并返回
        return R.success("查询指定类型分类成功", categories);
    }


}
